/*
 * $AIST_Release: 0.9.0 $
 * Copyright 2011 Information Technology Research Institute, National
 * Institute of Advanced Industrial Science and Technology
 * 
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 * 
 *    http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

import org.scalatest.FunSuite

import parser._
import scala.collection.immutable.PagedSeq
import scala.util.parsing.input.PagedSeqReader

class LexerSuite extends FunSuite {
  import Lexer._
  val data = List( 
    ("""
proto "querylog.proto"
queries_per_degree: table sum[lat: int][lon: int] of int;
log_record: QueryLogProto = input;
loc: Location = locationinfo(log_record.ip);
emit queries_per_degree[int(loc.lat)][int(loc.lon)] <- 1;
""",
List(
  Keyword("proto"), StringLit("querylog.proto"), 
  Identifier("queries_per_degree"), Keyword(":"), Keyword("table"), Identifier("sum"), 
                                    Keyword("["), Identifier("lat"), Keyword(":"), Identifier("int"), Keyword("]"),
                                    Keyword("["), Identifier("lon"), Keyword(":"), Identifier("int"), Keyword("]"),
                                    Keyword("of"), Identifier("int"), Keyword(";"),
  Identifier("log_record"), Keyword(":"), Identifier("QueryLogProto"), Keyword("="), Identifier("input"), Keyword(";"),
  Identifier("loc"), Keyword(":"), Identifier("Location"), Keyword("="), 
                                    Identifier("locationinfo"), Keyword("("), 
                                      Identifier("log_record"), Keyword("."), Identifier("ip"), Keyword(")"), Keyword(";"),
  Keyword("emit"), Identifier("queries_per_degree"), 
          Keyword("["), Identifier("int"), Keyword("("), Identifier("loc"), Keyword("."), Identifier("lat"), Keyword(")"), Keyword("]"),
          Keyword("["), Identifier("int"), Keyword("("), Identifier("loc"), Keyword("."), Identifier("lon"), Keyword(")"), Keyword("]"),
          Keyword("<-"), DecLit("1"), Keyword(";")
  )
))

    test("Lexer test") {

      for ((in, expect) <- data) {
        var scanner = new Lexer.Scanner(in)

        def f(scanner: Lexer.Scanner): List[Lexer.Token] = scanner.first match {
          case Lexer.EOF           => Nil
          case Lexer.ErrorToken(s) => fail(s)
          case x                   => x::f(scanner.rest)
        }

        for ((i, j) <- f(scanner).zip(expect)) {
          assert(i == j, "%s != %s".format(i, j))
        }
     }
   }
}

